`timescale 1ns / 1ps
//以太网接收数据，将应用层数据写入fifo 并通过串口将fifo中的数据发送出去
module eth_udp_rx_rgmii_test(
    input Clk,   //开发板晶振
    input reset_n,   
    //以太网接收
    input rgmii_rx_clk, //PHY芯片提供时钟   发送时钟FPGA->PHY;接收时钟PHY->FPGA
    input [3:0]rgmii_rxd,
    input rgmii_rxdv,
    output eth_reset_n, //以太网复位信号
    output uart_tx
    );
   wire rgmii_rx_clk_i; 
   wire gmii_rx_clk; //以太网接收时钟
   wire [7:0]gmii_rxd; //以太网接收数据
   wire gmii_rxdv;  //以太网接收数据有效标志
   wire clk125m;
   wire [47:0] exter_mac;
   wire [31:0] exter_ip;
   wire [15:0] exter_port;
   wire [15:0] rx_data_length;
   wire        fifo_full;
   wire        fifo_wr;
   wire [7:0]  fifo_din;
   wire        rx_pkt_done;
   wire        rx_pkt_err;
  
   wire fifo_rd_req;
   wire rx_empty;
   wire [7:0] dout;
   wire uart_send_en;
   wire uart_tx_done;
   wire [7:0] uart_tx_data;
   
   parameter LOCAL_MAC = 48'h00_07_ed_ac_62_00;
   parameter LOCAL_IP = 32'hc0_a8_00_02;
   parameter LOCAL_PORT = 16'd5000;
   
   assign eth_reset_n = 1;
   
	
	pll_eth 	pll_eth(
		.inclk0(rgmii_rx_clk),  //进行寄存 可提升时钟质量
		.c0(rgmii_rx_clk_i)
	);
   
	rgmii_to_gmii u_rgmii_to_gmii(   //RJ45->PHY->FPGA(RGMII->GMII)
			.rgmii_rxc(rgmii_rx_clk_i),
			.rgmii_rxd(rgmii_rxd),
			.rgmii_rxdv(rgmii_rxdv),
			.gmii_rxc(gmii_rx_clk),
			.gmii_rxd(gmii_rxd),
			.gmii_rxdv(gmii_rxdv)
	);
  
  udp_gmii_rx	udp_gmii_rx(       //GMII接收模块(FPGA接收)
		.reset_n			(reset_n),
		.local_mac		(LOCAL_MAC),
		.local_ip		(LOCAL_IP),
		.local_port		(LOCAL_PORT),
		.fifo_full		(fifo_full),
		.fifo_wr			(fifo_wr),
		.fifo_din		(fifo_din),
		.clk125M_o		(clk125m),
		.exter_mac		(exter_mac),
		.exter_ip		(exter_ip),
		.exter_port		(exter_port),
		.rx_data_length(rx_data_length),
		.one_pkt_done	(rx_pkt_done),
		.pkt_error		(rx_pkt_err),
		.debug_cal_crc	(),
		.gmii_rx_clk	(gmii_rx_clk),	
		.gmii_rxdv		(gmii_rxdv),
		.gmii_rxd		(gmii_rxd)	
	);

	FIFO 	FIFO_inst(    //接收到的应用层数据进行寄存
		.data		(fifo_din),
		.rdclk	(Clk),
		.rdreq	(fifo_rd_req),
		.wrclk	(clk125m),
		.wrreq	(fifo_wr),
		.q			(dout),
		.rdempty	(rx_empty),
		.wrfull	()
	);

    uart_send_ctrl uart_send_ctrl(  //发送应用层数据(用户数据),发送完一个字节便读取一个字节的数据。
        .clk(Clk),
        .reset_n(reset_n),
        .fifo_rd_data(dout),
        .fifo_empty(rx_empty),
        .fifo_rd_req(fifo_rd_req),
        
        .uart_tx_done(uart_tx_done),
        .uart_send_en(uart_send_en),
        .uart_tx_data(uart_tx_data)
    );
	 
	uart_byte_tx	uart_byte_tx(  //以字节为单位进行发送，发送完毕产生Done信号发送至串口控制模块
		.Clk(Clk),       //50M时钟输入
		.Rst_n(reset_n),     //模块复位
		.data_byte(uart_tx_data), //待传输8bit数据
		.send_en(uart_send_en),   //发送使能
		.baud_set(0),  //波特率设置
		.Rs232_Tx(uart_tx),  //Rs232输出信号
		.Tx_Done(uart_tx_done),   //一次发送数据完成标志
		.uart_state() //发送数据状态
	);
	
endmodule
